package com.example.demo.controller;


import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.demo.entity.user.UserInfo;
import com.example.demo.service.user.UserService;
import com.example.demo.service.user.dto.UserInfoDto;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import jakarta.websocket.server.PathParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.Objects;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 1. web开发:服务器 + 客户端 (cs) http(socket)
 * 2. mvc编程:model + view + controller   controller(接收参数+验证) + service（所有的业务逻辑,核心） + repostitory(dao,mapper)(数据库操作)
 * 3. restful接口:
 * 4. 熟悉swagger接口
 * 5. 熟悉jdbc操作
 * 6. 熟悉数据库操作
 * 7. spring +  springmvc + mybatis(mybatis-plus)
 * 8. http://ip:port/route?param=value
 * 9. 范型
 * 10. lambda
 * 11. 分页接口
 */


import javax.swing.*;
/*标记该类为Spring控制器，将java类转换成RESTful API控制器，用于接收HTTP请求与响应*/
// 用自己的语言来做笔记
@RestController
//用法：可定义在RestController控制器类上，也可定义在类的方法上
@RequestMapping("/api/v1/user")
//作用:定义RestController控制器的请求路径,定义URL=http://8080:""
public class UserController {

    //让spring从容器中找到UserService类型的bean,自动生成对象userService
    @Autowired
    private UserService userService;

    //定义以下方法接收客户端的HTTP POST请求  用以下方法来处理接收到的数据 (添加用户)
    @PostMapping
    //@RequestBody  处理post数据如json，将其转换成一个Java对象userInfoDto
    //@Valid 校检接收到的客户端数据,以UserInfoDto为规则
    /*如果客户端提交的数据不符合规则（比如用户名空、邮箱格式错误），Spring 会自动抛出 MethodArgumentNotValidException 异常，并包含具体的错误信息（如 "用户名不能为空"）。*/
    public ResponseEntity<UserInfo> addUser(@RequestBody @Valid UserInfoDto userInfoDto) {
        System.out.println(userInfoDto);
        return ResponseEntity.ok(userService.addUser(userInfoDto));
        //返回客户端200成功
        //ResponseEntity 表示整个 HTTP 响应：状态码、Header 和 Body
    }

    //从后端获取数据，查询信息，\\d+ 正则表达式，表示一个数字或多个数字
    //: 是一个特殊分隔符，用于为路径变量（{} 包裹的部分）指定正则表达式约束，语法格式为：{变量名:正则表达式}
    //@GetMapping多用于数据查询功能
    @GetMapping("/{id:\\d+}")
    public ResponseEntity<UserInfo> getUserById(@PathVariable  Long id) {
        /*该注解用于参数绑定，获取路径上的{}中的部分绑定到后面的id上，若名称不同则需添加属性*/
        if (Objects.isNull(id) || id <= 0) {
            return null;
        }
        return ResponseEntity.ok(userService.getUserById(id));
    }

    //通过id查找执行删除操作
    @DeleteMapping("/{id:\\d+}")
    public ResponseEntity<Boolean> deleteUserById(@PathVariable Long id) {
        if (Objects.isNull(id) && id <= 0) {
            return null;
        }
        return ResponseEntity.ok(userService.deleteUserById(id));
    }
    //获取page参数
    @GetMapping("/page")
    public ResponseEntity<Page<UserInfo>> queryUserList(@RequestParam Long pageCurrent, @RequestParam Long pageSize) {
        if (Objects.isNull(pageCurrent) || pageCurrent < 0) {
            pageCurrent = 0l;
        }
        if (Objects.isNull(pageSize) || pageSize < 0) {
            pageSize = 10l;
        }
        return ResponseEntity.ok(userService.queryUserList(pageCurrent, pageSize));
    }

}
